/*
 * 文件名:CAudioTag.h
 *
 * 	 功能描述:ID3v1，ID3v2和APEv2标签结构体定义以及读取方法申明
 *  创建日期: 2011-1-15
 *  版本Ver0.01
 *  作者: huanying2000
 *  版权:copyright 2010 by the Camellia project 
 *  free software under the terms of the LGPL 2.1
 */

#ifndef CAUDIOTAG_H_
#define CAUDIOTAG_H_

#include "Globel.hpp"

class CAudioTag
{
	public:
		CAudioTag(ifstream *in);
		virtual ~CAudioTag();
		bool getTags(KAudioTag *pAudioTag);
#ifdef DEBUG
		void printTags(void) const;
#endif

	private:
		enum
		{
			HAVE_ID3V1 = 1,
			HAVE_ID3V2 = 2,
			HAVE_APEV2 = 4
		};

		//define for ID3V1 tag
		struct KID3V1Tag
		{
			char Header[3];        									/* 标签头必须是"TAG"否则认为没有标签,3字节 */
			char Title[30 * GBK_UTF8_RATE + 1];           /* 标题,30字节 */
			char Artist[30 * GBK_UTF8_RATE + 1]; 			/* 作者,30字节 */
			char Album[30 * GBK_UTF8_RATE + 1];        	/* 专集,30字节 */
			char Year[4 + 1]; 											/* 出品年代,4字节 */
			char Comment[30 * GBK_UTF8_RATE + 1]; 	/* 备注,28字节 */
			//char Reserve[1]; 										/* 保留,1字节 */
			//char Track[1]; 											/* 音轨,1字节 */
			char Genre[1]; 											/* 类型,1字节 */
		};

		//defines for ID3V2 tag
		/* ID3v2标签头 */
		struct TagHeader
		{
			char header[3];             		/* ID3v2标签头3个字节，必须为ID3，否则认为没有ID3v2标签 */
			char version;                       /* ID3v2标签版本号，ID3v2.3就记录3 */
			char reversion;                    /* ID3v2标签副版本号，此版本记录为0 */
			char flag;
			char tagSize[4];                   /* ID3v2标签大小，包括标签头的10个字节和所有的标签帧的大小 */
		};

		/* ID3v2标签帧帧头 */
		struct TagFrameHeader
		{
			char frameID[4];        			/* 标签帧标识 */
			char frameSize[4];           	/* 标签帧大小，不包括标签帧帧头的10个字节 */
			char flags[2];
		};

		/* ID3v2标签帧 */
		struct TagFrame
		{
			TagFrameHeader tagFrameHeader;
			string frameBody;						/* 标签帧帧体，即标签帧内容 */
			uint frameBodySize;              	/* 标签帧帧体大小 */
		};

		/* 媒体文件APEv2标签的标签头或标签尾结构体，大小为32字节 */
		 struct APEv2HF
		 {
			char	preamble[8];			/* APEv2标签是否存在的标志，占8字节 */
			char	version[4];			/* APEv2标签的版本，占4字节 */
			uint tagSize;					/* APEv2标签的大小，包括标签尾但不包括标签头的大小，占4字节 */	//char	tagsize[4];
			uint itemcount;				/* APEv2标签元素的个数，占4字节 */	//char	itemcount[4];
			char	tagflags[4];			/* APEv2标签的标识，占4字节 */
			char	reserved[8];			/* APEv2标签保留，值全为零，占8字节 */
		 };

		 /* 媒体文件APEv2标签的标签元素 */
		 struct APEv2Item
		 {
			string itemvalue;				/* APEv2标签标签元素的内容 */
			uint itemvaluesize;			/* APEv2标签标签元素内容的大小，占4字节 */	//char itemvaluesize[4];
			char	itemflags[4];				/* APEv2标签标签元素的标识，占4字节 */
			char itemkey[256];			/* APEv2标签标签元素关键字，大小可以为2个到255可见字符 */
		 };

		int tagflag;
		ifstream *inputFile;

		KID3V1Tag id3v1Tag;

		TagHeader tagHeader;              /* ID3v2标签头 */
		TagFrame tagFrame;        			/* ID3v2标签帧 */
		int tagTotalSize;                       /* ID3v2标签总大小 */
		vector<TagFrame> tagBody;

		vector<APEv2Item> apev2Tags;
		char filename[128];

		bool getID3V1Tag(void);
		bool getID3V2Tag(void);
		bool getAPEV2Tag(void);
};

#endif /* CAUDIOTAG_H_ */
